package com.treeroot.queue;

public class CircleArray {
    /**
     * 最大容量
     */
    private int maxSize;
    /**
     * front指向队列的第一个元素，也就是说 arr[front] 就是队列的第一个元素
     */
    private int front;
    /**
     * rear指向队列的最后一个元素的后一个位置
     * 因为希望空出一个空间做为约定
     */
    private int rear;
    /**
     * 该数组用于存放数据，模拟队列
     */
    private int[] arr;

    public CircleArray(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        front = 0;
        rear = 0;
    }

    /**
     * 判断队列是否已满
     *
     * @return 如果队列已满则返回true，否则返回false
     */
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }


    public boolean isEmpty() {
        return rear == front;
    }


    public void add(int data) {
        if (isFull()) {
            System.out.println("队列已满，无法添加数据");
            throw new RuntimeException("队列已满，无法添加数据");
        } else {
            //1.直接将数据加入
            arr[rear] = data;
            //2.后移rear,【考虑取模】
            rear = (rear + 1) % maxSize;
        }
    }

    //获取（出队列）队列数据
    public int getQueueDate() {
        //判断队列是否空
        if (isEmpty()) {
            System.out.println("队列空异常");
            throw new RuntimeException("队列为空，无法取出数据");
        } else {
            //0.分析出front是执行队列的第一个元素
            //1.先将front对应的值保存到临时变量
            int value = arr[front];
            //2.将front后移
            front = (front + 1) % maxSize;
            //3.将临时保存的变量返回
            return value;
        }
    }

    //显示所有数据
    public void showQueueData() {
        if (isEmpty()) {
            System.out.println("队列空~没有数据");
        } else {
            //思路:从front开始遍历，遍历多少个元素
            //
            for (int i = front; i < front + size(); i++) {
                System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i]);
            }
        }
    }

    //当前队列有效数据的个数
    public int size() {
        // rear =1
        // front = 0
        //maxSize = 3
        return (rear + maxSize - front) % maxSize;
    }

    //显示队列头部数据
    public void showHeadData() {
        if (isEmpty()) {
            System.out.println("队列空异常");
            throw new RuntimeException("队列为空，无法取出数据");
        }
        System.out.printf("%d\n", arr[front]);
    }


}
